package com.kamistoat.netty.nioprac;

import java.io.File;
import java.io.RandomAccessFile;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

/**
 * NIO客户端
 */
public class NIOClient {
    public static void main(String[] args) throws Exception{
        // new一个SocketChannel
        SocketChannel socketChannel = SocketChannel.open();
        // 由于服务端会产生一个非阻塞的SocketChannel，所以客户端的接收也要设置为非阻塞，
        socketChannel.configureBlocking(false);
        // 提供服务器端的ip和端口
        InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 6666);

        // 链接服务器，如果没有连接上，NIO的特性允许非阻塞，因此不会阻塞在connect，而是可以执行其他工作
        if(!socketChannel.connect(inetSocketAddress)){
            while(!socketChannel.finishConnect()){
                System.out.println("因为链接需要时间，客户端不会阻塞，可以做其他工作..");
            }
        }

        // 如果连接成功，服务端的ServerSocketChannel会为这次连接分配一个SocketChannel，而客户端则会使用上面定义的那个socketChannel进行接收
        // 如果链接成功就发送数据
        String str = "hello, kamistoat";

        // 客户端也需要一个buffer用于发送和接收数据
        // 直接执行 Buffer.wrap() 可以不提前声明Buffer容量的情况下直接根据内容长度制作Buffer
        ByteBuffer byteBuffer = ByteBuffer.wrap(str.getBytes());
        // 将Buffer中的数据写入到SocketChannel中，注意此时服务端和客户端的SocketChannel是同一个.
        // SocketChannel写完数据后，会触发 读就绪 事件，然后被服务端Selector捕捉到，就是服务端的事情了
        socketChannel.write(byteBuffer);

        // 手动让客户端不退出，保持链接
        System.in.read();
    }
}
